package com.example.validatestudy.demos.tread;

public class JoinTest {

    /**
     * Thread的方法，源码是while(isAlive()) { wait(0); } ，意思是t线程存活时，当前线程wait(0)等待至t线程结束，然后才执行当前线程。主线程调用的 isAlive() 和 wait()方法。所以主线程会挂起，注意：native方法 isAlive() 判断的是t线程状态。
     * t.join()：先执行t线程再执行主线程。t线程执行完后，会隐形调用exit()唤醒当前线程。
     * t.join(timeout)：先执行t线程再执行主线程。t线程提前执行完 或 timout计时结束时 会唤醒主线程。
     * @param args
     * @throws InterruptedException
     */
    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(new Runnable(){
            public void run() {
                System.out.println("t1开始执行");
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("t1执行完毕");
            }
        });
        Thread t2 = new Thread(new Runnable(){
            public void run(){
                System.out.println("t2开始执行");
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("t2执行完毕");
            }
        });

        //先执行t1.t2 在执行main
        t1.start();
        t2.start();
        /**
         * t.join()：先执行t线程再执行主线程。t线程执行完后，会隐形调用exit()唤醒当前线程。
         * t.join(timeout)：先执行t线程再执行主线程。t线程提前执行完 或 timout计时结束时 会唤醒主线程。
         */
        t1.join();
        t2.join(10000);
        doIt();
    }

    public static void doIt(){
        System.out.println("主线程执行完毕");
    }

}
